home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-68k-src / machines / amiga68k / libsrc / time / gmtime.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  2KB  |  75 lines

  1. #include <time.h>
  2.  
  3. /* Rules for leap-years:
  4.  * 1. every 4th year is a leap year
  5.  * 2. every 100th year is none
  6.  * 3. every 400th is one 
  7.  * 4. 1900 was none, 2000 is one
  8.  */
  9.  
  10. extern int __dstflag;
  11.  
  12. static char monthtable[]=
  13. { 31,29,31,30,31,30,31,31,30,31,30 };
  14.  
  15. struct tm *gmtime(const time_t *t)
  16. {
  17.   static struct tm utim;
  18.   signed long tim;
  19.   int leapday=0,leapyear=0,i;
  20.   tim=*t;
  21.   utim.tm_sec=tim%60;
  22.   tim/=60;
  23.   utim.tm_min=tim%60;
  24.   tim/=60;
  25.   utim.tm_hour=tim%24;
  26.   tim=tim/24+719162;
  27.   utim.tm_wday=(tim+1)%7;
  28.   utim.tm_year=tim/146097*400-1899;
  29.   tim%=146097;
  30.   if(tim>=145731)
  31.   { leapyear++; /* The day is in one of the 400th */
  32.     if(tim==146096)
  33.     { tim--; /* Be careful: The last of the 4 centuries is 1 day longer */
  34.       leapday++; }
  35.   }
  36.   utim.tm_year+=tim/36524*100;
  37.   tim%=36524;
  38.   if(tim>=36159) 
  39.     leapyear--; /* The day is in one of the 100th */
  40.   utim.tm_year+=tim/1461*4;
  41.   tim%=1461;
  42.   if(tim>=1095)
  43.   { leapyear++; /* The day is in one of the 4th */
  44.     if(tim==1460)
  45.     { tim--; /* Be careful: The 4th year is 1 day longer */
  46.       leapday++; }  
  47.   }
  48.   utim.tm_year+=tim/365;
  49.   tim=tim%365+leapday;
  50.   utim.tm_yday=tim;
  51.   if(!leapyear&&tim>=31+28)
  52.     tim++; /* add 1 for 29-Feb if no leap year */
  53.   for(i=0;i<11;i++)
  54.     if(tim<monthtable[i])
  55.       break;
  56.     else
  57.       tim-=monthtable[i];
  58.   utim.tm_mon=i;
  59.   utim.tm_mday=tim+1;
  60.   utim.tm_isdst=__dstflag;
  61.   return &utim;
  62. }
  63.  
  64. /*
  65.  * 719162 number of days between 1.1.1 and 1.1.1970 
  66.  *        if the calendar would go so far which it doesn't :-)
  67.  *        this is true for all of the following.
  68.  * 146097 number of days from 1.1.1 to 1.1.401
  69.  * 145731 number of days from 1.1.1 to 1.1.400
  70.  *  36524 number of days from 1.1.1 to 1.1.101
  71.  *  36159 number of days from 1.1.1 to 1.1.100
  72.  *   1461 number of days from 1.1.1 to 1.1.5
  73.  *   1095 number of days from 1.1.1 to 1.1.4
  74.  */
  75.